#pragma once
#ifndef HSD_SERIALIZE_TOOL_HPP__
#define HSD_SERIALIZE_TOOL_HPP__

#include <opencv2/opencv.hpp>

inline namespace Seria
{
	void Save(CArchive& ar, const bool flag);
	void Load(CArchive& ar, bool& flag);

	void Save(CArchive& ar, const CString& str);
	void Load(CArchive& ar, CString& str);

    void Save(CArchive& ar, const cv::Mat& image);
    void Load(CArchive& ar, cv::Mat& image);

    template <typename _Tp>
    void Save(CArchive& ar, const cv::Point_<_Tp>& pt);
    template <typename _Tp>
    void Load(CArchive& ar, cv::Point_<_Tp>& pt);

    template <typename _Tp>
    void Save(CArchive& ar, const cv::Rect_<_Tp>& rect1);
    template <typename _Tp>
    void Load(CArchive& ar, cv::Rect_<_Tp>& rect1);

    template <typename _Tp>
    void Save(CArchive& ar, const std::vector<cv::Point_<_Tp>>& pts);
    template <typename _Tp>
    void Load(CArchive& ar, std::vector <cv::Point_<_Tp>>& pts);

    template <typename _Tp>
    void Save(CArchive& ar, const std::vector<_Tp>& vals);
    template <typename _Tp>
    void Load(CArchive& ar, std::vector <_Tp>& vals);

}


template void Seria::Save(CArchive& ar, const cv::Point& pt);
template void Seria::Save(CArchive& ar, const cv::Point2f& pt);
template void Seria::Save(CArchive& ar, const cv::Point2d& pt);
template void Seria::Load(CArchive& ar, cv::Point& pt);
template void Seria::Load(CArchive& ar, cv::Point2f& pt);
template void Seria::Load(CArchive& ar, cv::Point2d& pt);


template void Seria::Save(CArchive& ar, const cv::Rect& pt);
template void Seria::Save(CArchive& ar, const cv::Rect2f& pt);
template void Seria::Save(CArchive& ar, const cv::Rect2d& pt);
template void Seria::Load(CArchive& ar, cv::Rect& pt);
template void Seria::Load(CArchive& ar, cv::Rect2f& pt);
template void Seria::Load(CArchive& ar, cv::Rect2d& pt);


template void Seria::Save(CArchive& ar, const std::vector<cv::Point>& pts);
template void Seria::Save(CArchive& ar, const std::vector<cv::Point2f>& pts);
template void Seria::Save(CArchive& ar, const std::vector<cv::Point2d>& pts);
template void Seria::Load(CArchive& ar, std::vector <cv::Point>& pts);
template void Seria::Load(CArchive& ar, std::vector <cv::Point2f>& pts);
template void Seria::Load(CArchive& ar, std::vector <cv::Point2d>& pts);


template void Seria::Save(CArchive& ar, const std::vector<int>& vals);
template void Seria::Save(CArchive& ar, const std::vector<float>& vals);
template void Seria::Save(CArchive& ar, const std::vector<double>& vals);
template void Seria::Load(CArchive& ar, std::vector <int>& vals);
template void Seria::Load(CArchive& ar, std::vector <float>& vals);
template void Seria::Load(CArchive& ar, std::vector <double>& vals);



#endif
